package test;
/**
 * 二维数组的问题
 * 我们在初始化一个任意大小的二维数组。(为简化分析我们使用二维方阵) 我们将用两种不同方式迭代同一个数组，分析结果
 * 两种迭代方式的性能差距很大
 * @param args
 */
public class TheProblemOf2DArray {
 	//数组大小：数组越大，性能差距越明显
	private static final int ARR_SIZE = 9999;
    public static void main(String[] args){
    	//新数组
    	int arr[][] = new int[ARR_SIZE][ARR_SIZE];
    	long currTime = System.currentTimeMillis();
    	colMajor(arr);
    	System.out.println("Total time in colMajor:"+(System.currentTimeMillis()-currTime)+" ms");
    	int arr1[][] =new int[ARR_SIZE][ARR_SIZE];
    	currTime = System.currentTimeMillis();
    	rowMajor(arr1);
    	System.out.println("Total time in colMajor:"+(System.currentTimeMillis()-currTime)+" ms");
    }
    /**
     * 下面的代码按列为主遍历数组
     * 即在扫描下一行之前先扫描完本行
     * @param arr
     */
    private static void colMajor(int arr[][]) {
		for(int i =0 ;i<ARR_SIZE;i++){
			for(int j =0;j<ARR_SIZE;j++){
				arr[i][j] = i + j;
			}
		}
	}
    
    /**
     * 如果我们转换内外循环
     * 程序就以行为主顺序遍历数组
     * 即在扫描下一列之前先扫面完本列
     * 这意味着我们访问数组时每次都在访问不同的行
     * 代码微小的改变将导致这个程序话费更多的时间完成遍历
     * @param arr
     */
    private static void rowMajor(int arr[][]){
    	
    	for(int i =0 ;i<ARR_SIZE;i++){
			for(int j =0;j<ARR_SIZE;j++){
				arr[j][i] = i + j;
			}
		}
    }
    
}
